package manager

import (
	"fmt"
	"log"
	"sync"

	rediscli "go-ws-server/redis"

	"github.com/gorilla/websocket"

	"go-ws-server/model/resp"
)

type User struct {
	name string
	age  int
	sex  string
}

var conns = make(map[string]*websocket.Conn)
var mu sync.RWMutex

// WebSocket 连接注册功能，用于将用户 ID 与其对应的 WebSocket 连接关联存储。
func Register(userId string, conn *websocket.Conn) {
	mu.Lock()
	defer mu.Unlock()
	conns[userId] = conn

	// 添加到 Redis 在线列表
	rediscli.Rdb.SAdd(rediscli.Ctx, "online:users", userId)

	log.Println("用户", userId, "已连接")

}

// WebSocket 连接取消注册（注销）功能，用于从连接池中移除指定用户的 WebSocket 连接
func Unregister(userId string) {
	mu.Lock()
	defer mu.Unlock()
	delete(conns, userId)

	// 从 Redis 移除在线状态
	rediscli.Rdb.SRem(rediscli.Ctx, "online:users", userId)
}

// 推送消息给指定的人
func SendToUser(userId string, message string) error {
	mu.RLock()
	conn, ok := conns[userId]
	mu.RUnlock()

	if !ok {
		return fmt.Errorf("user %s is offline", userId) // 明确返回错误
	}

	if err := conn.WriteMessage(websocket.TextMessage, []byte(message)); err != nil {
		return fmt.Errorf("failed to send message: %w", err)
	}

	log.Printf("Message sent to user %s: %s", userId, message)
	return nil
}

/* 推送消息给所有用户*/
func PushToAll(message string, excludeUserId string) {
	mu.RLock()
	defer mu.RUnlock()

	for userId, conn := range conns {
		if userId == excludeUserId {
			continue // 跳过发消息的人自己
		}

		err := conn.WriteMessage(websocket.TextMessage, []byte(message))
		if err != nil {
			log.Printf("向用户 %s 推送消息失败: %v\n", userId, err)
			_ = conn.Close()
			go Unregister(userId)
		}
	}
}

/* 推送消息 给客户端，要求他刷新数据 */
func PushRefreshToClient(userId string) {
	mu.RLock()
	conn, ok := conns[userId]
	mu.RUnlock()

	if !ok {
		log.Printf("❌ 用户 %s 不在线，无法推送刷新消息\n", userId)
		return
	}

	// 构造响应结构
	resp := resp.WsCommandReponse{
		Cmd:     66666,
		Code:    200,
		Message: "收到新消息，需要刷新数据",
		Data:    nil, // 或填其他内容
	}

	if err := conn.WriteJSON(resp); err != nil {
		log.Printf("❌ 向用户 %s 推送刷新消息失败: %v\n", userId, err)
		_ = conn.Close()
		go Unregister(userId)
		return
	}

	log.Printf("✅ 向用户 %s 推送刷新消息成功\n", userId)
}
